package forcebuckle;

/**字符串转换整数 (atoi)
 * 函数myAtoi(string s) 的算法如下：
 * 读入字符串并丢弃无用的前导空格
 * 检查下一个字符（假设还未到字符末尾）为正还是负号，读取该字符（如果有）。 确定最终结果是负数还是正数。 如果两者都不存在，则假定结果为正。
 * 读入下一个字符，直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
 * 将前面步骤读入的这些数字转换为整数（即，"123" -> 123， "0032" -> 32）。如果没有读入数字，则整数为 0 。必要时更改符号（从步骤 2 开始）。
 * 如果整数数超过 32 位有符号整数范围 [−231, 231− 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −231 的整数应该被固定为 −231 ，大于 231− 1 的整数应该被固定为 231− 1 。
 * 返回整数作为最终结果。
 */
public class StringToInteger {
    public static void main(String[] args) {
        StringToInteger stringToInteger=new StringToInteger();
        System.out.println(stringToInteger.myAtoi(" -424"));
    }

    public int  myAtoi(String s) {
        int length=s.length();
        char[] charArray= s.toCharArray();//字符串变字符数组
        //1.去除前导空格
        int index=0;
        while (index<length&&charArray[index]==' ') {
            index++;
        }
        //极端全是空格
        if(index==length){
            return 0;
        }
        //2.检查下一个字符（假设还未到字符末尾）为正还是负号
        int next=1;
        char firstchar=charArray[index];//第一个字符
        if(firstchar=='+'){
            index++;
        }else if(firstchar=='-'){
            index++;
            next=-1;
        }
        // 3、将后续出现的数字字符进行转换
        // 不能使用 long 类型，这是题目说的
        int a=0,ans=0;
        while(index<length){
            char crrChar=charArray[index];
            if(crrChar>'9'||crrChar<'0'){
                break;
            }
            int digit = charArray[index++] - '0';
            //判断范围
            if (ans > (Integer.MAX_VALUE - digit) / 10) {
                return next == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            ans = ans * 10 + digit;
        }
        return ans * next;
    }
}
